home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / ici / ici.cpi / parse.h < prev    next >
C/C++ Source or Header  |  1994-10-27  |  4KB  |  148 lines

  1. #ifndef    ICI_PARSE_H
  2. #define    ICI_PARSE_H
  3.  
  4. #ifndef    ICI_OBJECT_H
  5. #include "object.h"
  6. #endif
  7.  
  8. typedef struct
  9. {
  10.     int        t_what;        /* See TM_* and T_* below. */
  11.     union
  12.     {
  13.     long    tu_int;
  14.     double    tu_float;
  15.     char    *tu_str;    /* Malloced string. */
  16.     object_t *tu_obj;
  17.     }
  18.     tu;
  19. }
  20.     token_t;
  21.  
  22. #define    t_int    tu.tu_int
  23. #define    t_float    tu.tu_float
  24. #define    t_str    tu.tu_str
  25. #define    t_obj    tu.tu_obj
  26.  
  27. struct parse
  28. {
  29.     object_t    o_head;
  30.     file_t    *p_file;
  31.     int        p_lineno;    /* Diagnostic information. */
  32.     short    p_sol;        /* At first char in line. */
  33.     short    p_cr;        /* New-line cause by \r, not \n. */
  34.     token_t    p_got;
  35.     token_t    p_ungot;
  36.     func_t    *p_func;    /* NULL when not within scope. */
  37.     int        p_depth;    /* Depth within compound statements. */
  38. };
  39. #define    isparse(o)    ((o)->o_type == &parse_type)
  40. #define    parseof(o)    ((parse_t *)(o))
  41.  
  42. /*
  43.  * Token numbers.  Note that the precedence and order of binary operators
  44.  * is built into the token number; this drives the expression parser.
  45.  */
  46. #define    TM_SUBTYPE    0x003F        /* 6 bits. */
  47. #define    TM_TYPE        0x07C0        /* 5 bits. */
  48. #define    TM_PREC        0x7800        /* 4 bits, 0 is high (tight bind).*/
  49. #define    t_subtype(t)    ((t) & TM_SUBTYPE)
  50. #define    t_type(t)    ((t) & TM_TYPE)
  51. #define    t_prec(t)    (((t) & TM_PREC) >> 11)
  52. #define    TYPE(n)        ((n) << 6)
  53. #define    PREC(n)        ((n) << 11)
  54.  
  55. #define    T_NONE        TYPE(0)
  56. #define    T_NAME        TYPE(1)
  57. #define    T_SEMICOLON    TYPE(2)
  58. #define    T_EOF        TYPE(3)
  59. #define    T_INT        TYPE(4)
  60. #define    T_FLOAT        TYPE(5)
  61. #define    T_BINOP        TYPE(6)    /* Has sub-types, see below. */
  62. #define    T_ERROR        TYPE(7)
  63. #define    T_NULL        TYPE(8)
  64. #define    T_ONROUND    TYPE(9)
  65. #define    T_OFFROUND    TYPE(10)
  66. #define    T_ONCURLY    TYPE(11)
  67. #define    T_OFFCURLY    TYPE(12)
  68. #define    T_ONSQUARE    TYPE(13)
  69. #define    T_OFFSQUARE    TYPE(14)
  70. #define    T_DOT        TYPE(15)
  71. #define    T_PTR        TYPE(16)
  72. #define    T_REGEXP    TYPE(17)
  73. #define    T_STRING    TYPE(18)
  74. #define    T_EXCLAM    TYPE(19)
  75. #define    T_PLUSPLUS    TYPE(20)
  76. #define    T_MINUSMINUS    TYPE(21)
  77. #define    T_CONST        TYPE(22)
  78. /*#define    T_ONSQLESS    TYPE(23)*/
  79. /*#define    T_GRTOFFSQ    TYPE(24)*/
  80. #define    T_DOLLAR    TYPE(25)
  81. /*#define    T_ONSQONCURLY    TYPE(26)*/
  82. /*#define    T_OFFCURLYOFFSQ    TYPE(27)*/
  83. #define    T_AT        TYPE(28)
  84. /* Maximum value    TYPE(31) */
  85.  
  86. /*
  87.  * T_BINOP sub types.
  88.  */
  89. #define    T_ASTERIX    (PREC(0)|T_BINOP|1)
  90. #define    T_SLASH        (PREC(0)|T_BINOP|2)
  91. #define    T_PERCENT    (PREC(0)|T_BINOP|3)
  92. #define    T_PLUS        (PREC(1)|T_BINOP|4)
  93. #define    T_MINUS        (PREC(1)|T_BINOP|5)
  94. #define    T_GRTGRT    (PREC(2)|T_BINOP|6)
  95. #define    T_LESSLESS    (PREC(2)|T_BINOP|7)
  96. #define    T_LESS        (PREC(3)|T_BINOP|8)
  97. #define    T_GRT        (PREC(3)|T_BINOP|9)
  98. #define    T_LESSEQ    (PREC(3)|T_BINOP|10)
  99. #define    T_GRTEQ        (PREC(3)|T_BINOP|11)
  100. #define    T_EQEQ        (PREC(4)|T_BINOP|12)
  101. #define    T_EXCLAMEQ    (PREC(4)|T_BINOP|13)
  102. #define    T_TILDE        (PREC(4)|T_BINOP|14)
  103. #define    T_EXCLAMTILDE    (PREC(4)|T_BINOP|15)
  104. #define    T_2TILDE    (PREC(4)|T_BINOP|16)
  105. #define    T_3TILDE    (PREC(4)|T_BINOP|17)
  106. #define    T_AND        (PREC(5)|T_BINOP|18)
  107. #define    T_CARET        (PREC(6)|T_BINOP|19)
  108. #define    T_BAR        (PREC(7)|T_BINOP|20)
  109. #define    T_ANDAND    (PREC(8)|T_BINOP|21)
  110. #define    T_BARBAR    (PREC(9)|T_BINOP|22)
  111. #define    T_COLON        (PREC(10)|T_BINOP|23)
  112. #define    T_QUESTION    (PREC(11)|T_BINOP|24)
  113. #define    T_EQ        (PREC(12)|T_BINOP|25)
  114. #define    T_PLUSEQ    (PREC(12)|T_BINOP|26)
  115. #define    T_MINUSEQ    (PREC(12)|T_BINOP|27)
  116. #define    T_ASTERIXEQ    (PREC(12)|T_BINOP|28)
  117. #define    T_SLASHEQ    (PREC(12)|T_BINOP|29)
  118. #define    T_PERCENTEQ    (PREC(12)|T_BINOP|30)
  119. #define    T_GRTGRTEQ    (PREC(12)|T_BINOP|31)
  120. #define    T_LESSLESSEQ    (PREC(12)|T_BINOP|32)
  121. #define    T_ANDEQ        (PREC(12)|T_BINOP|33)
  122. #define    T_CARETEQ    (PREC(12)|T_BINOP|34)
  123. #define    T_BAREQ        (PREC(12)|T_BINOP|35)
  124. #define    T_2TILDEEQ    (PREC(12)|T_BINOP|36)
  125. #define    T_LESSEQGRT    (PREC(12)|T_BINOP|37)
  126. #define    T_COMMA        (PREC(13)|T_BINOP|38)
  127. /* Maximum values     (PREC(15)|T_BINOP|63) */
  128.  
  129. /*
  130.  * Reasons for doing things (compiling expressions generally).
  131.  */
  132. #define    FOR_VALUE    0
  133. #define    FOR_LVALUE    1
  134. #define    FOR_EFFECT    2
  135. #define    FOR_CONST    3
  136.  
  137. /*
  138.  * Expression tree.  This is what the parseing functions build and
  139.  * pass to compile_expr().
  140.  */
  141. struct expr
  142. {
  143.     int        e_what;        /* A token identifier, ie. T_*. */
  144.     expr_t    *e_arg[2];
  145.     object_t    *e_obj;
  146. };
  147. #endif
  148.